Celem projektu jest przeprowadzenie procesu odkrywania wiedzy z danych dotyczących filmów z serwisu YouTube.
Należy wskazać, jakie atrybuty powinien mieć przysłany film, aby trafił na kartę "na czasie".
Do dyspozycji są 2 zbiory danych: (dostępne tutaj)
38916 wierszy, 52 879 KB)40949 wierszy, 61 654 KB)W dalszej części sprawozdania, przedstawione zostaną dokładne statystyki i wyniki, uzyskane w wyniku przetwarzania atrybutów tekstowych z kolumn:
| video_id | trending_date | title | publish_time | tags | views | likes |
|---|---|---|---|---|---|---|
| dislikes | comment_count | thumbnail_link | comments_disabled | ratings_disabled | video_error_or_removed | description |
|---|---|---|---|---|---|---|
Wyniki atrybutów wizualnych, zostaną przedstawione w kolejnym sprawozdaniu.
Projekt został napisany w języku Python 3.7.
youtube-project\requirements.txt oraz youtube-project\Dockerfileyoutube-project\readme.mdNajważniejsza część kodu, która dotyczy tego etapu, znajduje się w pliku youtube-project\src\analyzers\text_analyzers.py.
Są tam Analyzer'y, odpowiedzialne za przetwarzanie atrybutów tekstowych.
Każdy z nich został opisany w wyżej wspomnianym pliku.
W wyniku uruchomienia Analyzerów, został wygenerowany poniższy plik JSON:
import chart_studio.plotly as py
import plotly.figure_factory as ff
import plotly
import json
import pandas as pd
import plotly.graph_objects as go
from plotly.offline import init_notebook_mode, iplot
from plotly.graph_objs import *
from io import StringIO
def json2csv(data, file, analyzer):
csv=''
if type(list(data[files[0]][analyzer].values())[0]) == dict:
keys = list(data[file][analyzer].values())[0].keys()
csv += 'Columns,' + ','.join(keys)
for column in list(data[file][analyzer]):
csv += '\n' + f'{column},' + ','.join([str(data[file][analyzer][column].get(key, 0)) for key in keys])
return csv
elif type(list(data[files[0]][analyzer].values())[0]) == int:
keys = list(data[file][analyzer].keys())
values = list(data[file][analyzer].values())
csv += ','.join(keys)
csv += '\n'
csv += ','.join([str(val) for val in values])
return csv
# print(json2csv(data, files[0], "BooleanAnalyzer")) # CaseAnalyzer BooleanAnalyzer
# type(list(data[files[0]]["CaseAnalyzer"].values())[0]) == dict
json_file = open('text.json')
data = json.load(json_file)
files = ["data/GB_videos_5p.csv", "data/US_videos_5p.csv"]
def plot_table(json_data, files, analyzer):
try:
for file in files:
csv = json2csv(json_data, file, analyzer)
df = pd.read_csv(StringIO(csv), sep=",")
layout = go.Layout(title=f'{analyzer} {file}')
table = ff.create_table(df)
fig = go.Figure(data=table, layout=layout)
plotly.offline.iplot(fig)
except Exception as e:
print('Nie można wyświetlić', e)
def plot_graph(json_data, files, analyzer):
try:
for file in files:
csv = json2csv(json_data, file, analyzer)
df = pd.read_csv(StringIO(csv), sep=",")
layout = go.Layout(title=f'{analyzer} {file}', barmode='stack')
columns=list(df.columns)
if len(list(df.iloc)) == 1:
data = [go.Bar(name=analyzer, x=columns, y=list(df.iloc)[0])]
else:
data = [go.Bar(name=row[0], x=columns[1:], y=row[1:]) for row in list(df.iloc)]
fig = go.Figure(data=data, layout=layout)
plotly.offline.iplot(fig)
except Exception as e:
print('Nie można wyświetlić', e)
Z tabel wynika, że nie warto blokować komentarzy i ocen, ponieważ tylko 683/38916 oraz 633/40949 takich filmów znalazło się na karcie "na czasie".
plot_table(data, files, "BooleanAnalyzer")
plot_graph(data, files, "BooleanAnalyzer")
Z tabel wynika, że:
Uwaga: Niektóre kolumny zostały wygenerowane automatycznie i nie mają znaczenia - np. comments_disabled, to wartości True/False
plot_table(data, files, "CaseAnalyzer")
plot_graph(data, files, "CaseAnalyzer")
Słowa zostały sprowadzone do podstawowej formy, używając bibloteki nltk i stemmera PorterStemmer.
Pierwszy raz można zaobserwować wyraźną różnicę pomiędzy wersjami GB i US.
W Wielkiej Brytanii opłaca się umieszczać tagi, które zawierają słowa: music, new, official, a w Stanach Zjednoczonych jedynie new
(poza słowami the, of i with, które powtarzają się w obu przypadkach).
Ważny jest także tytuł, który może zawierać słowa: music, official, of, the i with.
plot_table(data, files, "CommonWordsAnalyzer")
plot_graph(data, files, "CommonWordsAnalyzer")
Nie opłaca się umieszczać nagrania w sobotę i niedzielę.
plot_table(data, files, "DayAnalyzer")
plot_graph(data, files, "DayAnalyzer")
plot_table(data, files, "DigitsAnalyzer")
Liczby nie odgrywają dużej roli.
plot_graph(data, files, "DigitsAnalyzer")
Najlepiej umieszczać plik wideo pomiędzy godzinami 15-18.
Zdecydowanie trzeba unikać godzin nocnych, które nie zmieściły się w zestawieniu.
plot_table(data, files, "HourAnalyzer")
plot_graph(data, files, "HourAnalyzer")
Linki zazwyczaj nie są obecne. Czasami mogą zdarzyć się w opisie, lecz należy ich unikać.
plot_table(data, files, "HyperlinkAnalyzer")
plot_graph(data, files, "HyperlinkAnalyzer")
Przedstawione wartości w kolumnach, to liczba liter podzielona przez 10 (czyli liczba 3 przedstawia 30-39 liter).
Z tabel wynika, że:
plot_table(data, files, "LongTextLettersAnalyzer")
plot_graph(data, files, "LongTextLettersAnalyzer")
Przedstawione wartości w kolumnach, to liczba liter podzielona przez 5.
Nazwa kanału powinna zawierać mniej, a opis i tytuł - więcej niż 5 wyrazów.
plot_table(data, files, "LongTextWordsAnalyzer")
plot_graph(data, files, "LongTextWordsAnalyzer")
Brakuje opisów dla 619 filmów dla GB oraz 578 filmów dla US.
plot_table(data, files, "MissingValuesAnalyzer")
plot_graph(data, files, "MissingValuesAnalyzer")
Rozwinięcia oznaczeń można znaleźć na stronie https://medium.com/@muddaprince456/categorizing-and-pos-tagging-with-nltk-python-28f2bc9312c3
Dominują tagi JJ (adjective, przymiotnik) oraz NN (noun, rzeczownik).
plot_table(data, files, "PartsOfSpeechAnalyzer")
plot_graph(data, files, "PartsOfSpeechAnalyzer")
Obecność znaków specjalnych jest marginalna. Zazwyczaj, są to znaki specyficzne dla danego rejonu na świecie (np. "Kanji" dla krajów azjatyckich).
plot_table(data, files, "SpecialCharsAnalyzer")
plot_graph(data, files, "SpecialCharsAnalyzer")